const nodemailer = require("nodemailer");
const crypto = require("crypto");

class EmailService {
  constructor() {
    // 创建SMTP传输器
    this.transporter = nodemailer.createTransport({
      host: "smtp.163.com", // 网易163邮箱SMTP服务器
      port: 465,
      secure: true, // 使用SSL
      auth: {
        user: "yourname@163.com", // 你的邮箱地址
        pass: "key", // 邮箱授权码，非邮箱密码
      },
    });

    // 验证码有效期（5分钟）
    this.codeExpireTime = 5 * 60 * 1000;

    // 存储验证码（实际项目中建议使用Redis等缓存服务）
    this.codes = new Map();
  }

  /**
   * 生成随机验证码
   * @param {number} length - 验证码长度，默认6位
   * @returns {string} 随机验证码
   */
  generateCode(length = 6) {
    return crypto
      .randomBytes(length)
      .toString("base64")
      .replace(/[+/=]/g, "")
      .substring(0, length);
  }

  /**
   * 发送验证码邮件
   * @param {string} to - 接收邮箱地址
   * @returns {Promise<{code: string, expireTime: number}>} 验证码和过期时间
   */
  async sendVerificationCode(to) {
    const code = this.generateCode();
    const expireTime = Date.now() + this.codeExpireTime;

    // 构建邮件内容
    const mailOptions = {
      from: "yourname@163.com", // 发件人邮箱
      to, // 收件人邮箱
      subject: "【系统】验证码", // 邮件主题
      html: `
                <p>您的验证码是：<strong style="font-size: 20px;">${code}</strong></p>
                <p>该验证码5分钟内有效，请不要泄露给他人。</p>
            `,
    };

    // 发送邮件
    await this.transporter.sendMail(mailOptions);

    // 存储验证码（键：邮箱，值：{code, expireTime}）
    this.codes.set(to, { code, expireTime });

    return { code, expireTime };
  }

  /**
   * 验证用户输入的验证码
   * @param {string} email - 邮箱地址
   * @param {string} userCode - 用户输入的验证码
   * @returns {boolean} 验证结果
   */
  verifyCode(email, userCode) {
    const record = this.codes.get(email);

    if (!record) return false;

    // 检查验证码是否过期
    const isExpired = Date.now() > record.expireTime;
    if (isExpired) {
      this.codes.delete(email); // 过期则删除
      return false;
    }

    // 检查验证码是否匹配
    const isValid = record.code === userCode;
    if (isValid) {
      this.codes.delete(email); // 验证通过后删除
    }

    return isValid;
  }
}

// // 使用示例
// const emailService = new EmailService();

// // 发送验证码
// emailService
//   .sendVerificationCode("111111@qq.com")
//   .then(({ code, expireTime }) => {
//     console.log(`验证码已发送：${code}，过期时间：${new Date(expireTime)}`);
//   })
//   .catch((error) => {
//     console.error("发送失败：", error);
//   });

// // 验证验证码
// const isValid = emailService.verifyCode(
//   "11111@qq.com",
//   "用户输入的验证码"
// );
// console.log("验证结果：", isValid);
